"""
Модуль для кластеризации и анализа данных

Функции:
- clustering: выполняет кластеризацию объектов
- set_base_connectors: выбирает ближайшие объекты к базовой станции
- generate_graph: создает граф сети
- filter_connections: фильтрует граф сети по количеству коннектов
- short_paths: выполняет маршрутизацию сети и поиск кратчайшего пути
"""
from swarm_network import charts
from swarm_network import clusters
from swarm_network import data
from swarm_network import graph

# Чтение конфигурации и установка параметров генерации
config = data.read_config('config.yaml')
data_directory = config['data_directory']
base_point = config['base_point']
data_filename = config['data_filename']

# Ручное конфигурирование
# data_filename = "data-grid-100-side100000-z1000"
result_filename_objects = f'{data_filename}-results-routing-objects'
result_filename_clusters = f'{data_filename}-results-routing-clusters'
result_filename_routes = f'{data_filename}-results-routing-routes'
count_clusters = 20
base_connections = 3
leaders_connections = 3
objects_paths = 4 # Объекты для отображения маршрутов сети
show_clusters = True

# Получить данные из файла
df_objects = data.get_data(data_directory, data_filename)

# Кластеризация
df_objects, df_clusters = clusters.clustering(df_objects, count_clusters, base_point)

# Выбор ближайших к базовой станции
df_objects, df_clusters = clusters.set_base_connectors(df_objects, df_clusters, base_connections)

# Создание графа сети
Graph = graph.generate_graph(df_objects, df_clusters, base_point)

# Фильтрация графа сети по количество коннектов между кластерами и базовой станцией
filtered_G = graph.filter_connections(Graph, base_connections, leaders_connections)

# Маршрутизация сети и поиск кратчашего пути
df_objects = graph.short_paths(filtered_G, df_objects)

# Вывод статистики по графам сети в терминал
graph.print_stat(filtered_G)

# Вывод статистики по кластерам и объектам в терминал
clusters.print_stat(df_objects)

# Сохранение каналов связи в дата сет
df_clusters, df_routes = graph.routing_stat(filtered_G, df_clusters)

# Сохранение результатов в файл
# Объекты
data.save_data(df_objects, data_directory, result_filename_objects)
## Кластеры
data.save_data(df_clusters, data_directory, result_filename_clusters)
## Каналы связи
data.save_data(df_routes, data_directory, result_filename_routes)

# Отображение путей из конфигурации
charts.print_short_paths(filtered_G, df_objects, df_clusters, objects_paths, show_clusters)
